package app.controllers;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import app.models.Paciente;
import app.models.Perfil;
import app.models.enums.EstadosBrasileiros;
import app.models.enums.TipoConsulta;
import app.services.ConvenioService;
import app.services.LogService;
import app.services.PacienteService;
import app.services.PerfilService;
import app.services.UsuarioService;
import app.util.Constants;
import app.util.PlanningReport;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.interceptor.download.Download;
import br.com.caelum.vraptor.jasperreports.Report;
import br.com.caelum.vraptor.jasperreports.download.ReportDownload;
import br.com.caelum.vraptor.jasperreports.formats.ExportFormats;
import br.com.caelum.vraptor.validator.ValidationMessage;
import br.com.caelum.vraptor.view.Results;

@Resource
public class PacienteController extends Controller {

	private final Result result;
	private final Validator validator;
	private final PacienteService service;
	private final HttpServletRequest request;
	private final HttpServletResponse response;
	private final ConvenioService convenioService;
	private final PerfilService perfilService;
	private final LogService logService;
	private final UsuarioService usuarioService;
	public PacienteController(Result result, Validator validator, PacienteService service, PerfilService perfilService,
			HttpServletRequest request, ConvenioService convenioService, LogService logService, UsuarioService usuarioService, HttpServletResponse response) {
		
		this.result = result;
		this.perfilService = perfilService;
		this.validator = validator;
		this.service = service;
		this.request = request;
		this.convenioService = convenioService;
		this.logService = logService;
		this.usuarioService = usuarioService;
		this.response = response;
	}
	
	
	@Get("/pacientes")
	public void index() {
		result.include("pacientes", service.findAllOrdered());
		result.include("ultimosPacientes", service.findLastPacientes());
	}
	
	
	@Get("/pacientes/index")
	public void indexSiteMesh() {
		result.include("pacientes", service.findAllOrdered());
		result.include("ultimosPacientes", service.findLastPacientes());
		
		result.forwardTo("/WEB-INF/jsp/paciente/index.jsp");
	}
	
	
	@Get("/pacientes/find")
	public void index(String filter) {
		result.include("filter", filter);
		result.include("pacientes", service.findPacientesByFilter(filter));
		
		result.forwardTo("/WEB-INF/jsp/paciente/table.jsp");
	}
	
	
	@Get("/pacientes/new")
	public void form() {
		result.include("estadosBrasileiros", EstadosBrasileiros.values());
		result.include("tipos", TipoConsulta.values());
		result.include("convenios", convenioService.findAll());
	}
	
	
	@Post("/pacientes/save")
	public void save(Paciente paciente) {
		
		Perfil perfil = perfilService.findPerfilByName(Constants.PACIENTE_PROFILE);
		
		paciente.getUsuario().setIdPerfil(perfil.getId().intValue());
		paciente.getUsuario().setPerfil(perfil);
		
		if(paciente.getCarteiraConvenio() != null && paciente.getCarteiraConvenio().getIdConvenio() != null){
			paciente.getCarteiraConvenio().setConvenio(convenioService.find(paciente.getCarteiraConvenio().getIdConvenio().longValue()));
		}
		
		result.include("paciente", paciente);
		
		if (null != request.getParameter("submit")) {
			if (request.getParameter("submit").equals("Confirmar")) {
				validator.validate(paciente);
				validator.validate(paciente.getUsuario());
				validator.validate(paciente.getUsuario().getEndereco());
				
				if(usuarioService.validateNameLength(paciente.getUsuario())){
					validator.add(new ValidationMessage(bundle.getString("tamanhoNome.short"), Constants.ERROR));
				}
				
				if(paciente.getCarteiraConvenio() != null && paciente.getCarteiraConvenio().getConvenio().getNome() != null){
					if(paciente.getCarteiraConvenio().getConvenio().getNome().equals(Constants.UNIMED) || paciente.getCarteiraConvenio().getConvenio().getNome().equals(Constants.UNIMED.toLowerCase())){
						if(paciente.getCarteiraConvenio().getAbrangencia() == null || paciente.getCarteiraConvenio().getDataVencimento() == null || paciente.getCarteiraConvenio().getVia() == null){
							validator.add(new ValidationMessage(bundle.getString("unimedRequirededFilds.empty"), Constants.ERROR));
						}
					}
				}
				
				validator.onErrorForwardTo(this).form();
				
				service.create(paciente);
				
				logService.createLog(Constants.NEW_PACIENTE + paciente.getId());
				
				result.forwardTo(this).index();
			}
		} else {
			result.forwardTo(this).form();
		}
	}
	
	@Post("/pacientes/update")
	public void update(Paciente paciente) {
		
		Perfil perfil = perfilService.findPerfilByName(Constants.PACIENTE_PROFILE);
		
		paciente.getUsuario().setIdPerfil(perfil.getId().intValue());
		paciente.getUsuario().setPerfil(perfil);
		
		if(paciente.getCarteiraConvenio() != null && paciente.getCarteiraConvenio().getIdConvenio() != null){
			paciente.getCarteiraConvenio().setConvenio(convenioService.find(paciente.getCarteiraConvenio().getIdConvenio().longValue()));
		}
		
		validator.validate(paciente);
		validator.validate(paciente.getUsuario());
		validator.validate(paciente.getUsuario().getEndereco());
		
		if(usuarioService.validateNameLength(paciente.getUsuario())){
			validator.add(new ValidationMessage(bundle.getString("tamanhoNome.short"), Constants.ERROR));
		}
		
		if(paciente.getCarteiraConvenio() != null && paciente.getCarteiraConvenio().getConvenio().getNome() != null){
			if(paciente.getCarteiraConvenio().getConvenio().getNome().equals(Constants.UNIMED) || paciente.getCarteiraConvenio().getConvenio().getNome().equals(Constants.UNIMED.toLowerCase())){
				if(paciente.getCarteiraConvenio().getAbrangencia() == null || paciente.getCarteiraConvenio().getDataVencimento() == null || paciente.getCarteiraConvenio().getVia() == null){
					validator.add(new ValidationMessage(bundle.getString("unimedRequirededFilds.empty"), Constants.ERROR));
				}
			}
		}
		
		validator.onErrorForwardTo(this).edit(paciente.getId());
		
		service.update(paciente);
		
		logService.createLog(Constants.UPDATE_PACIENTE + paciente.getId());
		
		result.forwardTo(this).index();
	}
	
	
	@Get("/pacientes/{id}/edit")
	public void edit(Long id) {
		result.include("estadosBrasileiros", EstadosBrasileiros.values());
		result.include("tipos", TipoConsulta.values());
		result.include("convenios", convenioService.findAll());
		result.include("paciente", service.find(id));
	}
	
	
	@Get("/pacientes/{id}/updateStatus")
	public void updateStatus(Long id) {
		
		usuarioService.activeOrInactiveStatus(service.find(id).getUsuario());
		
		logService.createLog(Constants.UPDATE_STATUS_PACIENTE + id);
		
		result.forwardTo(this).index();
	}
	
	
	@Get("/pacientes/{id}/show")
	public void show(Long id) {
		result.include("paciente", service.find(id));
	}
	
	@Post("/pacientes/typeahead")
	public void findAll(Paciente paciente) {
		
		if(paciente == null || paciente.getUsuario().getNome() == null){
			return;
		}
		
		try {
			List<Paciente> pacientes = service.findPacientesByFilter(paciente.getUsuario().getNome());
		
			result.use(Results.json()).from(pacientes).include("usuario").serialize();
		} catch (Exception e) {
		      e.printStackTrace();
		}
	}
	
	@Post("/pacientes/modalTermo")
	public Download modalTermo() {
		List<Paciente> pacienteList = new ArrayList<Paciente>();
		pacienteList.add(new Paciente());
		return pdfPlanningReport(pacienteList, "termo_responsabilidade.jasper");
	}
	
	public Download pdfPlanningReport(List paramList, String template) {
        Report report = new PlanningReport(paramList, template);
        
        ReportDownload download = new ReportDownload(report, ExportFormats.pdf(), false);
        
        response.setHeader("Content-disposition", "inline; filename=" + download.getFileName() + ";");
        
        return download;
    }
	
}